package main

import (
	"bs11-functional/fib"
	"bufio"
	"fmt"
	"io"
	"strings"
)

type intGen func() int

//将 Fibonacci 包装成 Reader interface 接口; 以便可以像读取文件一样读取 Fibonacci
func (g intGen) Read(p []byte) (n int, err error) {
	next := g()
	if next > 100000 {
		//结束输出
		return 0, io.EOF
	}
	s := fmt.Sprintf("%d\n", next)

	// TODO: incorrect if p is too small!
	// p 缓冲区, 不能太小, 太小无法完整读取完一个数
	// 太小 next 需要进行缓存
	return strings.NewReader(s).Read(p)
}

func printFileContents(reader io.Reader) {
	scanner := bufio.NewScanner(reader)

	for scanner.Scan() {
		fmt.Println(scanner.Text())
	}
}

func main() {
	var f intGen = fib.Fibonacci()
	printFileContents(f)
}
